package dominio;

public class Tablero {

    //Atributos
    private static int tamañoPadre;
    public char[][] panel;
    private Posicion posicionPadre;
    private Tablero panelSuperior;

            
    //Métodos de acceso y modificación
    public static int getTamañoPadre() {
        return tamañoPadre;
    }

    public static void setTamañoPadre(int aTamañoPadre) {
        tamañoPadre = aTamañoPadre;
    }

    public Posicion getPosicionPadre() {
        return posicionPadre;
    }

    public void setPosicionPadre(Posicion posicion) {
        posicionPadre = posicion;
    }
    
    public Tablero getPanelSuperior() {
        return panelSuperior;
    }
    
    public char getFicha(int fila, int columna){
       return panel[fila][columna];
       
   }    
    
    //Constructores
    public Tablero(int tamaño, Posicion posicionPadre) {
        panel = new char[tamañoPadre][tamañoPadre];
        this.posicionPadre = posicionPadre;
        if (tamaño > 2) {
            panelSuperior = new Tablero(tamaño - 1, posicionPadre);
        }
    }    
    
    
    public Tablero(int tamaño, Posicion posicionPadre, boolean escalera) {
        panel = new char[tamañoPadre][tamañoPadre];
        if (escalera){
            this.posicionPadre = posicionPadre;
        }
        else{
            this.posicionPadre = obtenerPosicionAleatoria();
        }
        if (tamaño > 2) {
            panelSuperior = new Tablero(tamaño - 1, posicionPadre, escalera);
        }
    }

    
    //Método para rotar los paneles
    public void rotar(boolean horario) {
        char[][] nuevoPanel = new char[tamañoPadre][tamañoPadre];
        for (int i = 0; i < tamañoPadre; i++) {
            for (int j = 0; j < tamañoPadre; j++) {
                if (horario) {
                    nuevoPanel[j][tamañoPadre - i] = panel[i][j];
                } else {
                    nuevoPanel[tamañoPadre - j][i] = panel[i][j];
                }
            }
        }
        panel = nuevoPanel;
        
        //Se rotan los paneles superiores
        if (panelSuperior != null) {
            panelSuperior.rotar(horario);
        }
    }
    
    
    /**
     * Método para mover el paneles
     * @param sentido sentido del movimiento
     * @return retorna true si el movimiento es correcto, false en otro caso
     */
    public boolean mover(char sentido) {
        Posicion posicion = new Posicion();
        boolean pudoMover = validaPosicion(sentido);
        
        if(pudoMover){
            switch(sentido){
                case 'l':
                    posicion.setFila(this.posicionPadre.getFila());
                    posicion.setColumna(0);
                    break;
                case 'r':
                    posicion.setFila(this.posicionPadre.getFila());
                    posicion.setColumna(1);
                    break;
                case 'u':
                    posicion.setFila(0);
                    posicion.setColumna(this.posicionPadre.getColumna());
                    break;
                case 'd':
                    posicion.setFila(0);
                    posicion.setColumna(this.posicionPadre.getColumna());
                    break;
                default:
                    pudoMover = false;
                    break;
            }

            this.posicionPadre = posicion;
        }
        
        return pudoMover;
    }

    
    //Método para agregar una ficha
    public void agregarFicha(Posicion posicion, Ficha ficha) {
        panel[posicion.getFila()][posicion.getColumna()] = ficha.getColorFicha();
    }
        
    
    //Método que obtiene la posición aleatoria para distribuír luego los tableros
    private Posicion obtenerPosicionAleatoria() {
        Posicion posicion = new Posicion();
        posicion.setColumna(MetodosGenerales.numeroAleatorio(0, 1));
        posicion.setFila(MetodosGenerales.numeroAleatorio(0, 1));
        
        return posicion;
    }
    
    
    //Método que valida posiciones
    private boolean validaPosicion(char sentido){        
        Posicion posicion = getPosicionPadre();
        char tipoSentido;
        
        if(posicion.getFila() == 0 && posicion.getColumna() == 0)
            tipoSentido = 'l';
        else if (posicion.getFila() == 0 && posicion.getColumna() == 1)
                tipoSentido = 'r';
        else if (posicion.getFila() == 0 && posicion.getColumna() == 0)
            tipoSentido = 'u';
        else if (posicion.getFila() == 0 && posicion.getColumna() == 1)
            tipoSentido = 'd';
        return false;
    }
}
